// JavaScript Document

(function($){  
var	
    numid=0,
    doll = window.jQuery.fn.doll
	     = window.$.fn.doll   
		 =
	function(jQ) {
		
		if(typeof jQ =="undefined"){
			//当不传参数时 this 指向doll对象
			this.operName="__doll";
			jQ=this;
		}else{
			//当传参时构建一个jQuery对象
			if(typeof jQ !=""){
				jQ=window.jQuery(jQ);
				this.operName="__jQuery";
			}
		}
	    return new doll.fn.init(jQ);
	};
	 	
    doll.fn = doll.prototype = {
	_doll:function(){
		 $._prof("#debug",this)
		 
	},
	operN:"empty",
	operateObj:{a:"a"},
	constructor: doll ,
	getOper:function(){
		this.operN=this;
		//$._prof("#debug",this)
	    return this.operateObj;	
	},
	getThis:function(){
		 alert(this.constructor);
		},
	init:function( jQ ){
		if(jQ!="undefined"){
		    this.operateObj=jQ
		}else{
		 
		// $._prof("#debug",this.operateObj)//这里的this指的是doll对象
		this.operateObj=this;
		}
		 
		return this
		
		},
	fx:function(){
	 
		// $._prof("#debug",this);
		alert('这是类库的一个实例化方法[fx]');
	},
	_html:function(json){
		 ////alert(0)
		 /// $._prof("#debug",this)//这里的this指的是doll对象
		  // window.doll.fn._html.apply(this,[]) al函数改变了this 的指向
		  //现在指向 jQ
		 ////alert(this)
		 this.css(json)
	    return doll();	
	} ,
	_bg:function(obj,json){
	  return $.doll()._html.apply(obj,[json]);	
	  
	},
	_new:function(json){
	  return $.doll()._html.apply(this.operateObj,[json]);	
	},
	getjQ:function(jQobj){
		return jQobj;
		}
	}; 

    doll.fn.init.prototype = doll.fn;

    doll.tool=function(){
        alert("插件的工具方法测试");	
    }
	
	doll.mkdiv =function(str){	
	    var div = document.createElement('div');
        div.innerHTML = str;
		div.style.border="#ccc solid 2px";
		div.style.marginBottom="20px";
		return div;	
    }
	doll.getThis=function(ar){
		  
		  alert(numid+"->\n"+ar.constructor+"\n{"+ar+"}\n");
	 numid++;
		
	}
    doll.fn.fxn=function(n){
	    alert(n+":"+"fxn:doll的实例方法")	
	}

//第一种方法 扩展jQ的实例方法
	$.fn.foo2=function(){
		var i=0;
			for(p in this){
				i++;
				if(i>5){return;}
				alert(p);
				alert(this[p]);	
			}	
	}
	$.fn.toA=function(){
	  return [].slice.call( this );	
	}
	window.$.fn.getThis=
	window.jQuery.fn.getThis=function(){
		 alert(this.constructor);
		
	}
	
//第二种方法 扩展jQ的实例方法
$.fn.extend({ 
   fxfx:function(){alert("fxfx")},
   toArr: function(){
	  return [].slice.call( this );	
   },
   al:function(){
	   alert(this)
	   // $._prof("#debug",this)//这里的this指的是jQ对象
	   return window.doll.fn._html.apply(this,[])
	   },
   //_get()返回一个原生的js集合 与jQ的 get方法是一样的
    _get: function(num){
    return num == null ?

			// Return a 'clean' array
			this.toArray() :

			// Return just the object
			( num < 0 ? this[ this.length + num ] : this[ num ] );
    },
    _test: function(){
	   
	 var i=0;
			for(p in this){
				i++;
				if(i<2){
					
					alert(p);
					alert(this[p]);	
					x=this[p];
				}
			}	
	        var j=0;
			 
			for(p in x){
				j++;
				 if(j>1){return;}
			    alert(p);	
			}  
    },
	_prop:function(len,num){
		if( typeof len != "string" && typeof len != "number" ){
			try{
		
				for(  p in this ){
					$(num).append($.doll.mkdiv(
							p + ":<br>&nbsp;&nbsp;&nbsp;&nbsp;<pre>" +  
							(  len==-1 || len=="" ? this[p] : 
							   this[p]  ) +"</pre>"
						));
                  		 
		        }
		   }catch(e){alert(e)}
		   
		}else{
		    this._prop_(len,num);
		}
	},
	_prop_:function(len,num){		 
		num= typeof num == "undefined" ? 10 : num;		 
		len= typeof len == "undefined" ? 50: len;
		var i=0; 
		try{
		for(  p in this ){
			i++;
		    if( i < num || num==-1){
			this.append($.doll.mkdiv(
			    p + ":<br>&nbsp;&nbsp;&nbsp;&nbsp;<pre>" +  
				(  len==-1 || len=="" ? this[p] : 
				   this[p].toString().substr(0,len)  ) +"</pre>"
			));
			}		 
		}
		}catch(e){}
	    return this;	
	}
			

})

    window.doll= window._ = doll;
	

    //第一种方法扩展jQ的工具方法
    window.jQuery.doll=window.doll;
	  
	
    //第二种方法扩展jQ的工具方法
    $.extend({
		tool2:function(){
			alert("插件的工具方法测试2")
		},
		_prop:$.fn._prop ,
		
		_prof:function(id,obj){
		   obj= typeof obj == "undefined" ? window : obj;	
		   $._prop.apply(obj,[obj,id]);
		}
		
	});
	
	$.extend(doll,{
		tool2:function(){
			alert("插件的工具方法测试2")
		},
		_prop:$.fn._prop ,
		
		_prof:function(id,obj){
		   obj= typeof obj == "undefined" ? window : obj;	
		   $._prop.apply(obj,[obj,id]);
		}
		
	});
	
	$.extend(doll,{
		tool3:function(){
			alert("插件的工具方法测试3")
		}
		
	});
	
		
})(window.jQuery)